<script setup lang="ts">
// 类型别名用来给一个类型起个新名字。它只是起了一个新名字，并没有创建新类型。类型别名常用于联合类型。
type MyString = string
let myString : MyString = 'Hello World'
console.log(myString)


type MyNumber = number
let myNumber : MyNumber = 10
console.log(myNumber);

type MyBoolean = boolean
let myBoolean : MyBoolean = true
console.log(myBoolean);

type Age = number

// 泛型类型别名
type User<T>={
  name:T
  age:Age
}
const user1: User<String> = {
  name: "小王",
  age: 20
}
console.log(user1)

type intersetion = { props1: string } & { props2: number }
let mytype: intersetion = {
  props1: "",
  props2: 10
}
console.log(mytype)



/* 
interface Shape {
  color: string
}

interface Paint {
  paint: () => void
}

interface ISquare extends Shape, Paint {
  sideLen: number
}
*/
type Shape1 = { color: string }
type Paint1 = { paint: () => void }
type ISquare1 = Shape1 & Paint1 & { sideLen: number }

let square1: ISquare1 = {
  color: "red",
  paint: function () {
    console.log("painting")
  },
  sideLen: 10
}
console.log(square1)


/**
 * 相同点：
 * 扩展：接口使用extends  类型别名使用的是交叉类型
 * 都可以去描述对象 函数 数组 元组
 *
 * 不同点：
 * type 可以描述 基础类型;但是interface不行的
 * 同名的interface会合并; type不行
 * type是改名字 ;interface创建一个类型
 */

</script>

<template>
</template>